﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once
#include <string>
#include "OwnerPtr.h"

namespace gcmp
{
    class IJournalUiRecorder;
    class IJournalUiReplayer;

    /// \brief 日志Ui录制者和回放者构造器，派生并注册到日志中可以定制Ui录制和回放行为
    ///
    /// 注册接口JournalUtils::RegisterJournalUiRecorderAndReplayerCreator
    class IJournalUiRecorderAndReplayerCreator
    {
    public:
        /// 析构函数
        virtual ~IJournalUiRecorderAndReplayerCreator(void) {}
        /// \brief 获取日志Ui录制者和回放者所录制回放的控件类名
        ///
        /// 日志框架监听到Ui操作后，需要为该操作选择相应的录制者和回放者
        /// 若Ui操作的控件的父类没有将其事件截获，将根据控件的类名匹配录制者和回放者
        /// 事件截获见IJournalUiRecorderAndReplayerCreator::IsFilterChildEvent
        /// 控件类名若与日志中其余构造器声明的类名相同，构造器注册时会失败
        /// \return 控件类名
        virtual std::wstring GetWidgetClassName() const = 0;
        /// \brief 是否需要截获子控件的事件
        ///
        /// 截获子控件的事件后，本来由子控件录制回放的事件，将由声明截获的录制者回放者来录制回放
        /// \return 是否需要截获子控件的事件，true:是;false:否
        virtual bool IsFilterChildEvent() const = 0;
        /// \brief 创建日志Ui录制者
        ///
        /// \return 日志Ui录制者
        virtual OwnerPtr<IJournalUiRecorder> CreateRecorder() const = 0;
        /// \brief 创建日志Ui回放者
        ///
        /// \return 日志Ui回放者
        virtual OwnerPtr<IJournalUiReplayer> CreateReplayer() const = 0;
    };
}
